package com.linz.snake;

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.util.Random;

public class GamePanel extends JPanel implements KeyListener, ActionListener {

    int lenth; //蛇的长度
    int[] snakeX = new int[600];
    int[] snakeY = new int[500];

    //定义食物 food
    int foodX;
    int foodY;
    Random random = new Random();

    //死亡判断
    boolean isFail = false;

    //定义积分
    int score;


    //方向
    String fx = "U";

    //定义定时器
    Timer timer = new Timer(100,this);

    //判断游戏是否开始
    boolean isStart = false;


    //初始化
    void init(){
        //设置初始长度
        this.lenth = 3;

        //头部坐标
        snakeX[0] = 100;
        snakeY[0] = 100;

        //第1个身体坐标
        snakeX[1] = 75;
        snakeY[1] = 100;

        //第2个身体坐标
        snakeX[2] = 50;
        snakeY[2] = 100;

        //初始化蛇的移动方向为Right
        fx = "R";

        //初始化食物位置
        foodX = 25 + 25 * random.nextInt(34);
        foodY = 75 + 25 * random.nextInt(24);

        //初始化积分
        score = 0;

    }

    //构造器:程序运行之后先运行构造器 在构造器中调用方法能使程序运行时直接调用构造器内方法
    public GamePanel(){
        init();
        //获取键盘监听事件
        //获取焦点
        this.setFocusable(true);
        this.addKeyListener(this);

        timer.start();
    }


    /*
    2. 画板功能 JPanel
     */
    // - Graphics g 画笔
    @Override
    protected void paintComponent(Graphics g) {
        //清屏
        super.paintComponent(g);
        this.setBackground(Color.black);

        //放置头部广告
        Data.headerImage.paintIcon(this,g,25,11);

        //绘制游戏区域
        g.fillRect(25,75,850,600);

        //画一条静态蛇  Data类中rightImage变量中的图片
        //Data.rightImage.paintIcon(this,g,snakeX[0],snakeY[0]);
        //Data.bodyImage.paintIcon(this,g,snakeX[2],snakeY[2]);

        //蛇头方向
        if (fx.equals("R")){
            Data.rightImage.paintIcon(this,g,snakeX[0],snakeY[0]);
        }else if(fx.equals("L")){
            Data.leftImage.paintIcon(this,g,snakeX[0],snakeY[0]);
        }else if(fx.equals("U")){
            Data.upImage.paintIcon(this,g,snakeX[0],snakeY[0]);
        }else if(fx.equals("D")){
            Data.downImage.paintIcon(this,g,snakeX[0],snakeY[0]);
        }

        //蛇的身体长度 通过lenth控制
        for (int i = 1; i < lenth; i++) {
            Data.bodyImage.paintIcon(this,g,snakeX[i],snakeY[i]);
        }

        //提示游戏开始
        if (isStart==false){

            //画文字
            g.setColor(Color.white);

            //设置字体 引用Font类  参数为：字体,粗体,字号
            Font font = new Font("微软雅黑",Font.BOLD,40);
            g.setFont(font);
            g.drawString("按下空格开始游戏",300,400);
        }

        //失败提醒
        if (isFail){
            //设置画笔颜色
            g.setColor(Color.red);

            //设置文字字体 同上引用Font字体类   跟上边一样  下面改成不定义局部变量直接new
            //Font font = new Font("微软雅黑",Font.BOLD,40);

            //使用局部变量font
            g.setFont(new Font("微软雅黑",Font.BOLD,40));

            //写文字  文字,x坐标,y坐标
            g.drawString("这都能失败 爪巴",300,400);

        }


        //画食物
        Data.foodImage.paintIcon(this,g,foodX,foodY);

        //画积分
        g.setColor(Color.white);
        g.setFont(new Font("微软雅黑",Font.BOLD,18));
        g.drawString("长度："+lenth,750,35);
        g.drawString("分数："+score,750,50);

    }

    //接收键盘输入  监听 接口:KeyListener  实现接口必须重写接口内方法


    @Override
    public void keyTyped(KeyEvent e) {
        //键盘按下 -> 弹起
    }

    @Override
    public void keyPressed(KeyEvent e) {
        //键盘按下 -> 不释放

        //接收键盘的输入
        int  keyCode = e.getKeyCode();

        //如果是启动  按下空格暂停
        if (keyCode==KeyEvent.VK_SPACE){

            //失败
            if (isFail){
                //提示失败 重新开始
                isFail = false;
                //重新初始化游戏
                init();
            }else {
                //暂停/开始游戏
                isStart = !isStart;
            }

            //刷新界面
            repaint();
        }

        if (keyCode==KeyEvent.VK_UP){
            this.fx = "U";
        }else if (keyCode==KeyEvent.VK_DOWN){
            this.fx = "D";
        }else if (keyCode==KeyEvent.VK_LEFT){
            this.fx = "L";
        }else if (keyCode==KeyEvent.VK_RIGHT){
            this.fx = "R";
        }



    }

    @Override
    public void keyReleased(KeyEvent e) {
        //释放某个键
    }


    //监听事件流动  定时器  执行定时操作

    @Override
    public void actionPerformed(ActionEvent e) {
        //如果游戏处于开始状态 && 没失败
        if (isStart && isFail==false){

            for (int i = lenth-1; i > 0; i--) {
                //身体 身体都向前移动
                snakeX[i] = snakeX[i-1];
                snakeY[i] = snakeY[i-1];
            }

            //蛇运动控制
            if (fx.equals("R")){
                snakeX[0] += 25;
            }else if (fx.equals("L")){
                snakeX[0] -= 25;
            }else if (fx.equals("U")){
                snakeY[0] -= 25;
            }else if (fx.equals("D")){
                snakeY[0] += 25;
            }


            //边界判断  地板0点对角坐标 p(25,75)  p(25+850=875,75+600=675)
            if (snakeX[0]>850){
                snakeX[0] = 25;
            }else if (snakeX[0]<25){
                snakeX[0] = 850;
            }

            if (snakeY[0]>650){
                snakeY[0] = 75;
            }else if (snakeY[0]<75){
                snakeY[0] = 650;
            }


            //判断食物与蛇头重合
            if (snakeX[0]==foodX && snakeY[0]==foodY){
                //长度+1
                lenth++;
                score += 10;
                //重新生成食物
                foodX = 25 + 25*random.nextInt(34);
                foodY = 75 + 25*random.nextInt(24);
            }


            //结束判断
            for (int i = 1; i < lenth; i++) {
                if (snakeX[0]==snakeX[i] && snakeY[0]==snakeY[i]){
                    isFail = true;
                }
            }

            //刷新
            repaint();
        }



    }







}
